#include <iostream>
#include "list"

using namespace std;

class observer 
{
public:
    observer() { }
    virtual ~observer() {}

    virtual void print(const string& msg) { cout << "observer::" << msg << endl; }
};

class A : public observer
{
public:
    A() { }
    virtual ~A() {}

    virtual void print(const string& msg) { cout << "A::" << msg << endl; }
};

class B : public observer
{
public:
    B() { }
    virtual ~B() {}

    virtual void print(const string& msg) { cout << "B::" << msg << endl; }
};

class C : public observer
{
public:
    C() { }
    virtual ~C() {}

    virtual void print(const string& msg) { cout << "C::" << msg << endl; }
};


class center
{
public:
    center() { }
    virtual ~center() {}

    // 将观察者指针存放如队列中
    // 如果已经存在，那么不需要加入，直接返回
    // 如果不存在则加入队列
    void attach(observer* ob) {
        bool exist = false;
        for(const auto& o : obers) {
            if(o == ob) {
                exist = true;
                return;
            }
        }
        if(!exist) {
            obers.push_back(ob);
        }
    }

    // 解绑观察者
    // 在队列中查找需要解绑的观察者是否存在
    // 如果不存在不用管
    // 存在则解绑：冲队列中删除
    void detach(observer*ob) {
        for(const auto& o : obers) {
            if(o == ob) {
                obers.remove(ob);
                return;
            }
        }
    }

    void notify(const string& msg) {
        for(const auto& o : obers) {
            o->print(msg);
        }
    }

private:
    list<observer*> obers;
};

int main()
{
    center cen;
    observer* a = new A;
    observer* b = new B;
    observer* c = new C;
    cen.attach(a);
    cen.attach(b);
    cen.attach(c);

    cen.notify("this is a messgae");

    
    delete a;
    a = nullptr;
    delete b;
    b = nullptr;
    delete c;
    c = nullptr;

    return 0;
}